func change(amount int, coins []int) int {
    /*
        力扣 518 零钱兑换
        由题目可知，该题目为完全背包问题的变种
    
        1. dp 的定义
            dp[j] 表示 总额为j，包含硬币的组合数

        2. dp 递推公式
            dp[j] 等于 不包含coins[i]的情况（dp[j - coins[i]]）相加
            dp[j] += dp[j-coins[i]]

        3. 初始化
            总金额为0时，只有一种方法，就是什么都不取

        4. 确定遍历顺序
            求组合问题，需要先遍历物品，再遍历背包

        5. 推导dp数组
    */

    dp := make([]int, amount+1)
    dp[0] = 1
    for i:=0; i<len(coins); i++ {
        for j:=0; j<=amount; j++ {
            if j - coins[i] >= 0 {
                dp[j] += dp[j-coins[i]]
            }
        }
    }
    return dp[amount]
}